﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.UI.Bovespa.Parametro.Presenter;
using Sinacor.Infra.UI.Controls.SmartClient;
using System.Windows;
using PSE.Framework.UI.Resources;
using System.Windows.Threading;

namespace Sinacor.UI.Bovespa.Parametro.View.SmartClient
{
    public partial class CadastroParametroBolsa : SinacorWindow, ICadastroParametroBolsa
    {
        Presenter.CadastroParametroBolsa _presenter;

        private bool _executaF3 = false;
        private object _validacao;

        public Presenter.CadastroParametroBolsa presenter
        {
            get
            {
                return _presenter;
            }
            set
            {
                _presenter = value;
            }
        }

        public CadastroParametroBolsa()
        {
            InitializeComponent();
            this._presenter = new Presenter.CadastroParametroBolsa(this);
            this.DataContext = this._presenter;
            this.AfterInitialize += new RoutedEventHandler(CadastroParametroBolsa_AfterInitialize);
        }

        private void CadastroParametroBolsa_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this._presenter.Inicializar();
            this.dtgTipoNotas.NewItemType = typeof(Model.TipoNota);
            // Bug      : 7761
            // Author   : Apsilva
            _executaF3 = (this.CheckModulePlusLicense() && (bool)ckbIntegraContasCorrentes.IsChecked);
        }

        private void ckbZeraNota_Checked(object sender, RoutedEventArgs e)
        {
            rbAnualmente.IsEnabled = (bool)ckbZeraNota.IsChecked;
            rbDiariamente.IsEnabled = (bool)ckbZeraNota.IsChecked;
            rbMensalmente.IsEnabled = (bool)ckbZeraNota.IsChecked;
        }

        public void AtualizarMensagem()
        {
            cboMensagem.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            txtMensagem.UpdateTarget(SinacorTextBox.TextProperty);
        }
        
        public void AtualizarParametroBolsa()
        {
            ckbAgrupaNota.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ckbZeraNota.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            
            rbMensalmente.UpdateTarget(SinacorRadioButton.IsCheckedProperty);
            rbDiariamente.UpdateTarget(SinacorRadioButton.IsCheckedProperty);
            rbAnualmente.UpdateTarget(SinacorRadioButton.IsCheckedProperty);

            if (this._presenter.Mensalmente)
                rbMensalmente.IsChecked = true;
            else if (this._presenter.Diariamente)
                rbDiariamente.IsChecked = true;
            else if (this._presenter.Anualmente)
                rbAnualmente.IsChecked = true;
            
            ckbBaseLiquido.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            //txtCaminhoNota.UpdateTarget(SinacorTextBox.TextProperty);
            btnBrowse.UpdateTarget(SinacorTextBox.TextProperty);
            ckbComissao.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ckbCorrespondente.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ckbIntegraContabilidade.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ckbLiquidoNota.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ckbIntegraContasCorrentes.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ckbIntegraCustodia.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ckbNumeraNotaConsolidacao.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ckbIntegraTesouraria.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ckbSemOperacao.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ckbEnviaAgente.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ckbEnviaCarteira.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            txtUltimaNotaEmitida.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            cboMensagem.UpdateTarget(SinacorComboBox.SelectedValueProperty);

            ckbEnviaAgente.IsEnabled = (bool)ckbIntegraContasCorrentes.IsChecked;
            ckbEnviaCarteira.IsEnabled = (bool)ckbIntegraContasCorrentes.IsChecked;
            
            if (!ckbEnviaCarteira.IsEnabled)
            {
                ckbEnviaCarteira.IsChecked = false; 
            }

            if (!ckbEnviaAgente.IsEnabled)
            {
                ckbEnviaAgente.IsChecked = false;
            }

            _executaF3 = (bool)ckbIntegraContasCorrentes.IsChecked; 
        }

        public void AtualizarTipoNota()
        {
            dtgTipoNotas.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);

            txtNotaCorretagemDiaCredito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtNotaCorretagemDiaDebito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtNotaCorretagemEstornoCredito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtNotaCorretagemEstornoDebito.UpdateTarget(SinacorInt32TextBox.ValueProperty);

            txtAgenteDiaCredito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtAgenteDiaDebito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtAgenteEstornoCredito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtAgenteEstornoDebito.UpdateTarget(SinacorInt32TextBox.ValueProperty);

            txtIrOperacoesDiaDebito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtIrOperacoesEstornoCredito.UpdateTarget(SinacorInt32TextBox.ValueProperty);

            ckbEnviaAgente.UpdateTarget(SinacorCheckBox.IsCheckedProperty);
            ckbEnviaCarteira.UpdateTarget(SinacorCheckBox.IsCheckedProperty);

            txtAjusteNegocioDiaCredito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtAjusteNegocioDiaDebito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtAjusteNegocioEstornoCredito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtAjusteNegocioEstornoDebito.UpdateTarget(SinacorInt32TextBox.ValueProperty);

            txtAjusteDayTradeDiaCredito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtAjusteDayTradeDiaDebito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtAjusteDayTradeEstornoCredito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtAjusteDayTradeEstornoDebito.UpdateTarget(SinacorInt32TextBox.ValueProperty);

            txtAjustePosicaoDiaCredito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtAjustePosicaoDiaDebito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtAjustePosicaoEstornoCredito.UpdateTarget(SinacorInt32TextBox.ValueProperty);
            txtAjustePosicaoEstornoDebito.UpdateTarget(SinacorInt32TextBox.ValueProperty);

            if (dtgTipoNotas.Items.Count > 0)
            {
                dtgTipoNotas.SelectedItem = dtgTipoNotas.Items[0];
            }
        }

        public void DesabilitarZeraNota()
        {
            rbAnualmente.IsEnabled = false;
            rbDiariamente.IsEnabled = false;
            rbMensalmente.IsEnabled = false;
        }

        public void HabilitarZeraNota()
        {
            rbAnualmente.IsEnabled = true;
            rbDiariamente.IsEnabled = true;
            rbMensalmente.IsEnabled = true;
        }

        public void InformarAtualizacaoParametroSucesso()
        {
            SinacorMessageBox.Show((string)ResourceProviderManager.GetResourceProvider().TryGetResource("Bovespa.Parametro.Message.AtualizacaoParametroSucesso"), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void AtualizaIntegraContasCorrentes(bool _isEnabled)
        {
            ckbIntegraContasCorrentes.IsEnabled = _isEnabled;
        }

        private void btnCancelar_Click(object sender, System.Windows.RoutedEventArgs e)
        {

            this.ShowUserWaitingProcess();

            btnBrowse.Text = String.Empty;

            _presenter.Cancelar();

            this.HideUserWaitingProcess();
        }

        private void btnSalvar_Click(object sender, RoutedEventArgs e)
        {
            this.ShowUserWaitingProcess();

            _presenter.Mensalmente = (bool)rbMensalmente.IsChecked;
            _presenter.Anualmente = (bool)rbAnualmente.IsChecked;
            _presenter.Diariamente = (bool)rbDiariamente.IsChecked; 

            _presenter.Salvar();

            this.HideUserWaitingProcess();

        }

        #region ICadastroParametroBolsa Members

        public void InformarNumeroUltimaNotaObrigatorio()
        {
            SinacorMessageBox.Show((string)ResourceProviderManager.GetResourceProvider().TryGetResource("Bovespa.Parametro.ExceptionMessage.NumeroUltimaNotaObrigatorio"), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
            tabGeral.Focus();
            txtUltimaNotaEmitida.Focus();
        }

        public void InformarTamanhoMaximoCaminhoNota()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Parametro.ExceptionMessage.TamanhoMaximoCaminhoNota").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void DesabilitarIntegraSistemaContasCorrentes()
        {
            this.ckbIntegraContasCorrentes.IsEnabled = false;
        }

        #endregion

        private void txtCredito_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if ((_executaF3) && (e.Key == System.Windows.Input.Key.F3))
            {
                int? _codigo = this.PesquisaHistorico("C");

                if (_codigo != null)
                {
                    ((SinacorInt32TextBox)sender).Value = _codigo;
                }
            }
        }

        private int? PesquisaHistorico(string TipoHistorico)
        {
                ContaCorrente.View.SmartClient.PesquisaHistoricoContaCorrente _telaPesquisa = new Sinacor.UI.Bovespa.ContaCorrente.View.SmartClient.PesquisaHistoricoContaCorrente();

                _telaPesquisa.presenter.FiltroHistoricoContaCorrente.DiasProjecao = _presenter.TipoNota.NumeroDiasLiquidacao;
                _telaPesquisa.presenter.FiltroHistoricoContaCorrente.Tipo = TipoHistorico;
                _telaPesquisa.presenter.FiltroHistoricoContaCorrente.CodigoSistema = "BOL";

                _telaPesquisa.Owner = this;
                _telaPesquisa.SetMenuHeader("Bovespa.ContasCorrente.Label.PesquisaHistCC");
                _telaPesquisa.ShowDialog();

                if (_telaPesquisa.HistoricoContaCorrenteSelecionado != null) //Se foi selecionada uma linha 
                {
                    return (int)_telaPesquisa.HistoricoContaCorrenteSelecionado.Codigo;
                }
                else
                {
                    return null;
                }
        }

        private void txtDebito_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if ((_executaF3) && (e.Key == System.Windows.Input.Key.F3))
            {
                int? _codigo = this.PesquisaHistorico("D");

                if (_codigo != null)
                {
                    ((SinacorInt32TextBox)sender).Value = _codigo;
                }
            }
        }

        private void ckbIntegraContasCorrentes_Checked(object sender, RoutedEventArgs e)
        {
            ckbEnviaAgente.IsEnabled = (bool) ckbIntegraContasCorrentes.IsChecked;
            ckbEnviaCarteira.IsEnabled = (bool) ckbIntegraContasCorrentes.IsChecked;

            if (!ckbEnviaCarteira.IsEnabled)
            {
                ckbEnviaCarteira.IsChecked = false;
            }

            if (!ckbEnviaAgente.IsEnabled)
            {
                ckbEnviaAgente.IsChecked = false;
            }

            _executaF3 = (bool) ckbIntegraContasCorrentes.IsChecked; 
        }


        /// <summary>
        /// FGualberto.7COMm - Task: 6508
        /// </summary>
        /// <param name="sender"></param>
        public void ValidaNumeroUltimaNota(object sender)
        {
            if (txtUltimaNotaEmitida.Text.Equals(string.Empty))
            {
                txtUltimaNotaEmitida.Validate();
                _validacao = sender;
                txtUltimaNotaEmitida.Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(ManterFoco));
            }
            else
            {
                _validacao = null;
            }
        }

        /// <summary>
        /// FGualberto.7COMm - Task: 6508
        /// </summary>
        private void ManterFoco()
        { 
            if(_validacao != null)
            {
                ((SinacorTextBox) _validacao).Focus();
            }
        }

        /// <summary>
        /// FGualberto.7COMm - Task: 6508
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtUltimaNotaEmitida_LostFocus(object sender, RoutedEventArgs e)
        {
            ValidaNumeroUltimaNota(sender);
        }


    }
}